package com.gs.m_change_password

import android.content.Context
import android.util.Log
import com.gs.common.API
import com.gs.common.callback.HttpCallback
import com.gs.common.constant.HttpCode
import com.gs.common.constant.StateCode
import com.gs.common.sqlite.UserSqliteOpenHelper
import okhttp3.Call
import okhttp3.Response
import org.json.JSONObject
import java.net.ConnectException
import java.net.SocketTimeoutException

class ChangePasswordModel(context: Context) {

    private val api by lazy { API.getInstance() }
    private val userSqliteOpenHelper by lazy { UserSqliteOpenHelper(context) }

    fun changePassword(
        username: String,
        password: String,
        changePassword: String,
        block: (Int) -> Unit
    ) {
        block.invoke(StateCode.STATE_LOADING)
        api.changePassword(username, password, changePassword, object : HttpCallback {
            override fun onSuccess(call: Call, result: String, response: Response) {
                val resultJSON = JSONObject(result)
                Log.d("code", "${resultJSON["code"]}")
                if (resultJSON["code"] == HttpCode.SUCCESS_CODE) {
                    userSqliteOpenHelper.deleteAll()
                    block.invoke(StateCode.STATE_SUCCESS)
                    return
                }
                block.invoke(StateCode.STATE_FAILED)
            }

            override fun onError(call: Call, e: Exception) {
                when (e) {
                    is ConnectException -> {
                        block.invoke(StateCode.NETWORK_ERROR)
                    }

                    is SocketTimeoutException -> {
                        block.invoke(StateCode.SERVER_ERROR)
                    }

                    else -> {
                        block.invoke(StateCode.UNKNOWN_ERROR)
                    }
                }
            }

        })
    }

    companion object {
        private var instance: ChangePasswordModel? = null
        fun getInstance(context: Context): ChangePasswordModel {
            if (instance == null) {
                synchronized(this::class) {
                    if (instance == null) {
                        instance = ChangePasswordModel(context)
                    }
                }
            }
            return instance!!
        }
    }
}